#ifndef SCENE_H
#define SCENE_H

#include "object.h"
#include "object_world.h"
#include <glm/glm.hpp>
#include <vector>
#include <string>

class Scene : public Object {
protected:
    glm::vec2 world_size_ = glm::vec2(0); // 世界大小
    glm::vec2 camera_pos_ = glm::vec2(0); // 摄像机位置
    std::vector<ObjectScreen *> children_screen_; // 场景中的对象列表
    std::vector<ObjectWorld *> children_world_; // 场景中的对象列表
    bool is_paused_ = false;

public:
    Scene() = default;

    virtual ~Scene() = default;

    virtual void saveData(const std::string &file_path) {
    }

    virtual void loadData(const std::string &file_path) {
    }

    /**
     * 初始化场景
     */
    void init() override {
    }

    /**
     * 更新场景
     */
    void update(float dt) override;

    /**
     * 渲染场景
     */
    void render() override;

    /**
     * 清理场景
     */
    void clean() override;

    /**
     * 处理事件
     */
    bool handleEvents(SDL_Event &event) override;

    /**
     * 世界坐标转换为屏幕坐标
     */
    glm::vec2 WorldToScreen(const glm::vec2 &world_pos) const {
        return world_pos - camera_pos_;
    }

    /**
     * 屏幕坐标转换为世界坐标
     */
    glm::vec2 ScreenToWorld(const glm::vec2 &screen_pos) const {
        return screen_pos + camera_pos_;
    }

    glm::vec2 getCameraPos() const { return camera_pos_; } // 获取摄像机位置
    void setCameraPos(const glm::vec2 &pos); // 设置摄像机位置
    glm::vec2 getWorldSize() const { return world_size_; } // 获取世界大小
    void setWorldSize(const glm::vec2 &size) { world_size_ = size; } // 设置世界大小'
    void addChild(Object *child) override; // 添加子对象
    void removeChild(Object *child) override; // 移除子对象
    std::vector<ObjectScreen *> &getChildrenScreen() { return children_screen_; }
    std::vector<ObjectWorld *> &getChildrenWorld() { return children_world_; }
    void pause() { is_paused_ = true; }
    void resume() { is_paused_ = false; }
};

#endif // SCENE_H
